package com.igor.tarefas.database;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import com.igor.tarefas.model.Tarefa;

public class TarefaDao {
	// a conexão com o banco de dados
	private Connection connection;

	public TarefaDao() {
		this.connection = new ConnectionFactory().getConnection();
	}

	public void finaliza(long id) {
		Tarefa tarefa = selecionaTarefaSimples(id);
		tarefa.setFinalizado(true);
		altera(tarefa);
		
	}

	public void adiciona(Tarefa tarefa) {
		String sql = "insert into tarefas "
				+ "(descricao,finalizado,dataFinalizacao)" + " values (?,?,?)";
		try {
			/*
			 * if (tarefa.getDataFinalizacao() == null){
			 * tarefa.setDataFinalizacao(Calendar.getInstance()); }
			 */

			// prepared statement para inserção
			PreparedStatement stmt = connection.prepareStatement(sql);
			// seta os valores
			stmt.setString(1, tarefa.getDescricao());
			stmt.setBoolean(2, tarefa.isFinalizado());
			if(tarefa.getDataFinalizacao() != null){
				stmt.setDate(3, new Date(tarefa.getDataFinalizacao()
					.getTimeInMillis()));
			}else{
				stmt.setNull(3, java.sql.Types.NULL);
			}
			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public Tarefa selecionaTarefaSimples(long id) {
		Tarefa retorno = new Tarefa();
		PreparedStatement stmt;
		try {
			stmt = this.connection
					.prepareStatement("select * from tarefas where id = ?");
			stmt.setLong(1, id);
			ResultSet rs = stmt.executeQuery();
			if (rs.next()) {
				retorno.setId(rs.getLong("id"));
				retorno.setDescricao(rs.getString("descricao"));
				retorno.setFinalizado(rs.getBoolean("finalizado"));

				// montando a data através do Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataFinalizacao"));
				retorno.setDataFinalizacao(data);
			}
			rs.close();
			stmt.close();
			return retorno;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return retorno;

	}

	public List<Tarefa> getLista() {
		try {
			List<Tarefa> tarefas = new ArrayList<Tarefa>();
			PreparedStatement stmt = this.connection
					.prepareStatement("select * from tarefas");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				// criando o objeto Tarefa
				Tarefa tarefa = new Tarefa();
				tarefa.setId(rs.getLong("id"));
				tarefa.setDescricao(rs.getString("descricao"));
				tarefa.setFinalizado(rs.getBoolean("finalizado"));

				// montando a data através do Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataFinalizacao"));
				tarefa.setDataFinalizacao(data);

				// adicionando o objeto à lista
				tarefas.add(tarefa);
			}
			rs.close();
			stmt.close();
			return tarefas;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public void altera(Tarefa tarefa) {
		String sql = "update tarefas set descricao=?, finalizado=?,"
				+ "dataFinalizacao=? where id=?";
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, tarefa.getDescricao());
			stmt.setBoolean(2, tarefa.isFinalizado());
			stmt.setDate(3, new Date(tarefa.getDataFinalizacao()
					.getTimeInMillis()));
			stmt.setLong(4, tarefa.getId());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public void remove(Tarefa tarefa) {
		try {
			PreparedStatement stmt = connection.prepareStatement("delete"
					+ " from tarefas where id=?");
			stmt.setLong(1, tarefa.getId());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
